/*
  ESP8266-NodeMCU作为TcpClient连接到服务器
*/

#include <ESP8266WiFi.h>       // 本程序使用ESP8266WiFi库
#include <ESP8266WiFiMulti.h>  // 本程序使用ESP8266WiFiMulti库

ESP8266WiFiMulti wifiMulti;  // 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti'

void setup() {
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);

  wifiMulti.addAP("main(305)", "12345678.");
  wifiMulti.addAP("MEIZU", "147258369");
  wifiMulti.addAP("ROSE 4590", "12345678");

  Serial.begin(115200);  // 初始化串口通讯波特率为115200
  Serial.println('\n');
  Serial.println("Connecting ...");  // 通过串口监视器输出信息告知用户NodeMCU正在尝试连接WiFi
  int i = 0;
  while (wifiMulti.run() != WL_CONNECTED) {  // 此处的wifiMulti.run()是重点。通过wifiMulti.run()，NodeMCU将会在当前
    delay(1000);                             // 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU
    Serial.print('.');                       // 将会连接信号最强的那一个WiFi信号。
  }                                          // 一旦连接WiFI成功，wifiMulti.run()将会返回“WL_CONNECTED”。这也是
                                             // 此处while循环判断是否跳出循环的条件。

  Serial.print('\n');              // WiFi连接成功后
  Serial.print("Connected to ");   // NodeMCU将通过串口监视器输出
  Serial.println(WiFi.SSID());     // 连接的WiFI名称
  Serial.print("IP address:\t");   // 以及
  Serial.println(WiFi.localIP());  // NodeMCU的IP地址
  Serial.print('\n');
}

const char* host = "115.236.153.174";
const uint16_t port = 10981;

String mac_id;
String ress;

WiFiClient tcpclient;
void loop() {
  /* 新建一个WiFiClient类对象，作为TCP客户端对象 */

  /* 建立TCP连接 */
  Serial.print("Connecting to ");
  Serial.print(host);
  Serial.print(':');
  Serial.println(port);
  if (!tcpclient.connect(host, port)) {
    Serial.println("Connection failed");  // 如果连接失败，则打印连接失败信息，并返回
    delay(5000);
    return;
  }

  /* 如果连接成功，则发送一个字符串到TCP服务器 */
  Serial.println("Connected to TCPServer, sending data to server");
  mac_id = WiFi.macAddress();  //读出MAC地址
  Serial.println("MAC\t" + mac_id);
  Serial.print('\n');
  if (tcpclient.connected()) {
    tcpclient.println("hello, I am ESP8266.");
  }

  /* 等待TCP服务器返回消息 */
  while (1) {
    while (tcpclient.available() == 0) {  //未接收到服务器发来的消息
      if (tcpclient.connected()) {
        if (digitalRead(5) == 0) {
          tcpclient.print(mac_id + "=0");
        } else if (digitalRead(5) == 1) {
          tcpclient.print(mac_id + "=1");
        }
        delay(10000);
      }
    }
    while (tcpclient.available()) {  //接收到服务器发来的消息
      // String line=tcpclient.readStringUntil('\r');
      // char line=tcpclient.read();
      // Serial.print(line);
      ress = receive();
      if (ress != "") {
        Serial.println(ress);  //串口打印接收信息
        if (ress == mac_id + "=0") {
          digitalWrite(5, LOW);
        } else if (ress == mac_id + "=1") {
          digitalWrite(5, HIGH);
        }
      }
    }
  }
}

String receive() {
  String data;
  if (tcpclient.available()) {
    data = (char)tcpclient.read();
    data += receive();
  }
  return data;
}
